字符串

  标准库提供了一个 string 类型,作为前面所用的字符串文字量的补充。这个 string 类型提供了许多很有用的字符串操作,例如串拼接等。请看这个例子:

    string s1 = "Hello";
    string s2 = "world";

    void m1()
    {
        string s3 = s1 + "," + s1 + "!\n";
        cout << s3;
    }

在这里,s3 被初始化为如下的字符序列

    Hello,world!

随后是一个换行符。对于字符串的加法表示的就是拼接。你可以将一个字符串,或一个字符串文字量,或一个字符加到一个字符串上。

  在许多应用中,最常见的拼接形式是将某些东西追加到一个字符串的末尾。操作 += 直接支持这种工作。例如

    void m2(string& s1, string& s2)
    {
        s1 = s1 + '\n';    // 追加换行符
        s2 += '\n';        // 追加换行符
    }

这两种在字符串末尾追加的方式在语义上是等价的。但我喜欢后面的一种,因为它更紧凑,实现效率也可能更高一些。

  很自然,string 可以相互比较,也可以与一个字符串文字量比较。例如,

    string incantation;
    void respond(const string& answer)
    {
        if(answer == incantation)
        {
            // perform magic
        }
        else if(answer == "yes")
        {
            // ...
        }
        // ...
    }

  标准库的字符串类将在第20章中描述。在其他有用的特征中,还提供了操纵子字符串的功能。例如,

    string name = "Niels Stroustrup";
    void m3()
    {
        string s = name.substr(6, 10);     // s = "Stroustrup"
        name.replace(0, 5, "Nicholas");    // name变成“Nichiolas Stroustrup”
    }

这里的 substr() 运算返回一个字符串,它就是函数参数所指明的那个子串的副本。第一个参数是在本字符串里的一个下标(位置),第二个参数是所需子串的长度。因为下标开始于0,所以 s 得到的值是 Stroustrup

  replace() 操作用一个值替换掉指定的子串。在上面情况中,开始于位置 0 长 5 的子串是 Niels,它被用 Nicholas 取代。这样,name 最后的值就是 Nicholas Stroustrup。请注意,作为替代的串不必与被它替换的子串一样长。

🔚